package com.swing.jiaocheng;

import javax.swing.*;
import java.awt.*;

/**
 * 第三章 Java Swing布局管理器（详解版）
 */
public class LayoutLearn03 {

    /**
     * 在使用Swing向容器添加组件时，需要考虑组件的位置和大小。
     * 如果不使用布局管理器，则需要先在纸上画好各个组件的位置并计算组件间的距离，
     * 再向容器中添加。这样虽然能够灵活控制组件的位置，实现却非常麻烦。
     */

    /**
     * 为了加快开发速度，Java提供了一些布局管理器，它们可以将组件进行统一管理，这样开发人员
     * 就不需要考虑组件是否会重叠等问题。
     */

    //边框布局管理BorderLayout
    /**
     * 边框布局管理器是Window,JFrame和JDialog的默认布局管理器。
     * 边框布局管理器将窗口分为5个区域:
     *      North,South,East,West和Center.就是北，南，东，西，中
     *
     *
     * 提示：边框布局管理器并不要求所有区域都必须有组件，
     * 如果四周的区域（North、South、East 和 West 区域）没有组件，
     * 则由 Center 区域去补充。如果单个区域中添加的不只一个组件，
     * 那么后来添加的组件将覆盖原来的组件，所以，区域中只显示最后添加的一个组件。
     *
     *
     * BorderLayout布局管理器的构造方法如下所示。
     * BorderLayout(): 创建一个Border布局，组件之间没有间隙。
     * BorderLayout(int hgap, int vgap): 创建一个Border布局，其中hgap表示组件之间的横向间隔;
     * vgap表示组件之间的纵向间隔，单位是像素。
     */
    public static void mainBorderLayout(String[] args) {
        JFrame jFrame = new JFrame("java第三个GUI程序");
        jFrame.setSize(400, 200);
        jFrame.setLayout(new BorderLayout()); //为JFrame窗口设置布局为BorderLayout

        JButton button1=new JButton ("上");
        JButton button2=new JButton("左");
        JButton button3=new JButton("中");
        JButton button4=new JButton("右");
        JButton button5=new JButton("下");
        jFrame.add(button1,BorderLayout.NORTH);
        jFrame.add(button2,BorderLayout.WEST);
        jFrame.add(button3,BorderLayout.CENTER);
        jFrame.add(button4,BorderLayout.EAST);
        jFrame.add(button5,BorderLayout.SOUTH);
        jFrame.setBounds(300,200,600,300);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    /**
     * 流式布局管理器
     * FlowLayout（流式布局管理器）是 JPanel 和 JApplet 的默认布局管理器。FlowLayout 会将组件按照从上到下、从左到右的放置规律逐行进行定位。与其他布局管理器不同的是，FlowLayout 布局管理器不限制它所管理组件的大小，而是允许它们有自己的最佳大小。
     *
     * FlowLayout 布局管理器的构造方法如下。
     * FlowLayout()：创建一个布局管理器，使用默认的居中对齐方式和默认 5 像素的水平和垂直间隔。
     * FlowLayout(int align)：创建一个布局管理器，使用默认 5 像素的水平和垂直间隔。其中，align 表示组件的对齐方式，对齐的值必须是 FlowLayoutLEFT、FlowLayout.RIGHT 和 FlowLayout.CENTER，指定组件在这一行的位置是居左对齐、居右对齐或居中对齐。
     * FlowLayout(int align, int hgap,int vgap)：创建一个布局管理器，其中 align 表示组件的对齐方式；hgap 表示组件之间的横向间隔；vgap 表示组件之间的纵向间隔，单位是像素。
     */
    public static void mainFlowLayout(String[] args) {

        JFrame jFrame=new JFrame("Java第四个GUI程序");    //创建Frame窗口
        JPanel jPanel=new JPanel();    //创建面板
        JButton btn1=new JButton("1");    //创建按钮
        JButton btn2=new JButton("2");
        JButton btn3=new JButton("3");
        JButton btn4=new JButton("4");
        JButton btn5=new JButton("5");
        JButton btn6=new JButton("6");
        JButton btn7=new JButton("7");
        JButton btn8=new JButton("8");
        JButton btn9=new JButton("9");
        jPanel.add(btn1);    //面板中添加按钮
        jPanel.add(btn2);
        jPanel.add(btn3);
        jPanel.add(btn4);
        jPanel.add(btn5);
        jPanel.add(btn6);
        jPanel.add(btn7);
        jPanel.add(btn8);
        jPanel.add(btn9);

        //向JPanel添加FlowLayout布局管理器，将组件间的横向和纵向间隙都设置为20像素
        jPanel.setLayout(new FlowLayout(FlowLayout.LEADING, 20, 20));

        //设置背景色
        jPanel.setBackground(Color.gray);

        jFrame.add(jPanel);

        jFrame.setBounds(300,200,300,150);    //设置容器的大小
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    /**
     *卡片布局管理器
     * CardLayout（卡片布局管理器）能够帮助用户实现多个成员共享同一个显不空间，并且一次只显示一个容器组件的内容。
     *
     * CardLayout 布局管理器将容器分成许多层，每层的显示空间占据整个容器的大小，但是每层只允许放置一个组件。CardLayout 的构造方法如下。
     * CardLayout()：构造一个新布局，默认间隔为 0。
     * CardLayout(int hgap, int vgap)：创建布局管理器，并指定组件间的水平间隔（hgap）和垂直间隔（vgap）。
     */
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("java第五个程序");
        JPanel pane1 = new JPanel(); //面板1
        JPanel pane2 = new JPanel(); //面板2

        //卡片式布局的面板
        JPanel cards = new JPanel(new CardLayout());

        pane1.add(new JButton("登录按钮"));
        pane1.add(new JButton("注册按钮"));
        pane2.add(new JTextField("用户名文本框", 20));
        pane2.add(new JTextField("密码文本框",20));

        //向卡片式布局面板中添加面板1
        cards.add(pane1, "cards1");

        //向卡片式布局面板中添加面板2
        cards.add(pane2, "cards2");

        CardLayout cardsLayout = (CardLayout) (cards.getLayout());

        //调用show()方法显示面板2
        cardsLayout.show(cards,"cards1");

        jFrame.add(cards);
        jFrame.setBounds(300,200,400,200);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


}
